package com.sodimac.v2s.commands
{
	import com.adobe.cairngorm.commands.ICommand;
	import com.adobe.cairngorm.control.CairngormEvent;
	import com.sodimac.util.alerts.alert;
	import com.sodimac.util.commons.Session;
	import com.sodimac.util.commons.UtilString;
	import com.sodimac.util.commons.UtilXml;
	import com.sodimac.v2s.business.OCDelegate;
	import com.sodimac.v2s.business.OCWSSDelegate;
	import com.sodimac.v2s.events.emitirOrdenDeCompraEvent;
	import com.sodimac.v2s.events.grabarOrdenDeCompraEvent;
	import com.sodimac.v2s.model.ComprasModelLocator;
	
	import mx.rpc.IResponder;

	public class emitirOrdenDeCompraCommand implements ICommand, IResponder
	{
		private var modelo:ComprasModelLocator = ComprasModelLocator.getInstance();
		private var sesion:Session = new Session();
		private var listaErrores:String="";
		private var numOC:Number = 0;
		private var fechaOC:Date;
		private var idPedidoCorp: Number;	
		private var idEmpresa: String;
		private var idPais: String;
		
		
		
		
		public function execute(event:CairngormEvent):void
		{
			var delegate:OCDelegate = new OCDelegate(this);
			var delegateCO:OCWSSDelegate = new OCWSSDelegate(this);
			var encEvt:emitirOrdenDeCompraEvent = emitirOrdenDeCompraEvent(event);
			
			
			idPedidoCorp = encEvt.idPedidoCorp;
			idEmpresa    = encEvt.idEmpresa;
			idPais       = encEvt.idPais;
			
			//acceso especial a WS de Colombia (por ser WS-Security)
			if (idPais == 'CO') 
			{
				delegateCO.EmitirOrdenCompraCO(modelo.cabecera, encEvt.idPedidoCorp,
											encEvt.idProveedor, encEvt.fechaEnvio,
											encEvt.fechaEmision, encEvt.fechaRecepcion, 
											encEvt.idSucursal, encEvt.sumaCantidad,
											encEvt.arrProductos );				
			}
			else 
			{
				delegate.EmitirOrdenCompra(modelo.cabecera, encEvt.idPedidoCorp,
											encEvt.idProveedor, encEvt.fechaEnvio,
											encEvt.fechaEmision, encEvt.fechaRecepcion, 
											encEvt.idSucursal, encEvt.sumaCantidad,
											encEvt.arrProductos );
			}								

		}
		
        public function result(obj: Object): void
        {            
			var xmlList:XMLList;
			var xml:XML = new XML(obj.result);
			xml = UtilXml.removeNamespacesFromXML(xml);
					

	        var fecha:Date = new Date();     //get GMT
	        var strFecha:String ="";
			var result:Number;
			var glosa:String;
			
			if (idPais == 'CO') 
			{
				xmlList = new XMLList(xml);              //no viene con el nombre del método
				result = Number(xmlList.cabecera.@id);
				glosa =  xmlList.cabecera.@glosa;
				
			} else {
				xmlList = xml.children();
				result = Number(xmlList.cabecara.@id);  //cabecera mal escrito
				glosa =  xmlList.cabecara.@glosa;				
			}		
			trace("RESPUESTA\n" + xmlList.toXMLString());
			trace("WS EmitirOrdenDeCompra response id=" + result);

	  	      switch (result){
	  	      case 0:   //Ok
	  	      			
	  	      			numOC = Number(xmlList.payload.odSolicOCDoc.odGrSolicOC.odSolicOC.out_pmg_po_number);
	  	      			strFecha = String(xmlList.payload.odSolicOCDoc.odGrSolicOC.odSolicOC.pmg_release_date);
	  	      			strFecha =  UtilString.trimToNull(strFecha);
						strFecha = strFecha.substr(0,10);
						fecha.date = Number(strFecha.substr(8,2));
						fecha.month = Number(strFecha.substr(5,2))-1;
						fecha.fullYear = Number(strFecha.substr(0,4));	  
						
						//call event grabar OC
						var saveOCEvt:grabarOrdenDeCompraEvent = new grabarOrdenDeCompraEvent();
						saveOCEvt.idOC = numOC;
						saveOCEvt.fechaOC = fecha;
						saveOCEvt.idPedidoCorp = idPedidoCorp;
						saveOCEvt.idEmpresa = idEmpresa;
						saveOCEvt.idPais = idPais;
						saveOCEvt.dispatch();
	  	      			break;
	  	      			
	  	      case 1:   //Error
	  	      
	  	      			var payloadList:XMLList = xmlList.payload.odSolicOCDoc.odGrSolicOC.odSolicOC;
	  	      			checkErrorDetalle(payloadList);
	  	      			
	  	      			if (listaErrores.length > 0)
	  	      			{
	  	      				alert.error("No se pudo generar la O/C debido a problemas con los siguientes productos:\n\n"+  listaErrores);
	  	      			} else
	  	      			{
	  	      				alert.error("Ha ocurrido un error:\n\n"+  glosa);
	  	      			}	
	  	      			break;
	  	      			
	  	      default:  //reintentar
	  	      	  	     alert.info("Problemas con respuesta del servicio, " + 
									"favor reintente mas tarde.\n\n"+ glosa);
	  	      			break;                  	      						
	  	      }

        }
                
        public function fault(obj: Object): void
        {
        	alert.error("Ha ocurrido un error al emitir la OC.");
        	sesion.endSession();
        }	
        
        
        public function checkErrorDetalle(payloadList:XMLList):void
        {
        	var str:String = "";
			for each(var deta:XML in payloadList.detalle)			
			{
				if (UtilString.isNotBlank(deta.error_desc))
				{
					str += "SKU:  " + deta.prd_lvl_number + "\nPROBLEMA:  " + deta.error_desc  + ".\n\n"; 
				}
			}        
        	listaErrores =  str;
        
        }

	
		
	}
}